﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace GOFconsole
{
    public class Chapter7_Proxy
    {
        public void ProxyTest()
        {
            Proxy proxy = new Proxy();
            proxy.Request();
        }

    }

    //Subject类，定义了RealSubject和Proxy的共用接口，这样就在任何使用RealSubject的地方都可以使用Proxy
    abstract class Subject
    {
        public abstract void Request();
    }

    //RealSubject类，定义Proxy所代表的的真实实体
    class RealSubject : Subject
    {
        public override void Request()
        {
            Console.WriteLine("真实的请求");
        }
    }

    //Proxy类，保存一个引用使得代理可以访问实体，并提供一个与Subject的接口相同的接口，这里代理就可以代替实体
    class Proxy : Subject
    {
        RealSubject realSubject;

        public override void Request()
        {
            if (realSubject == null)
            {
                realSubject = new RealSubject();
            }
            Console.WriteLine("通过代理调用");
            realSubject.Request();
        }
    }

}
